/**
 * ！！！当前页面不应依赖项目中任何其他文件！！！
 */

import _get from "lodash/get";

/** 对象转query */
export const obj2Query = (obj: Record<string, any>) => {
  const queryList = Object.entries(obj)
    .map(([key, value]) => {
      if (value === undefined || value === null) return "";
      return `${key}=${value}`;
    })
    .filter((item) => item);
  return queryList.length ? `?${queryList.join("&")}` : "";
};

/** query信息 */
export type QueryInfo<QK extends string> = {
  /** 不一定存在 */
  [key in QK]?: string;
};

/** params信息 */
export type ParamsInfo<PK extends string> = {
  /** 路由结构上 必定存在 */
  [key in PK]: string;
};

export interface RouteInfo<QK extends string, PK extends string> {
  /** 路径 */
  path: string;
  /** 完整路径 */
  fullPath: string;
  /**
   * query参数
   * -------
   * TODO: 虽然可以通过currentPage.options获取到query参数，但这种方式并没有落实到官方文档中 不保证后续版本不会变动
   * 临时解决方案
   **/
  query: QueryInfo<QK>;
  /**
   * 路径参数
   * -------
   * 小程序中没有路径参数的概念，这里只是为了保持和vue-router的api一致
   */
  params: ParamsInfo<PK>;
}

/** 获取当前路由信息 */
export const getCurrentRouteInfo = <
  QK extends string = string,
  PK extends string = string,
>(): RouteInfo<QK, PK> => {
  const pages = getCurrentPages();
  const currentPage = pages[pages.length - 1];

  const path = currentPage.route || "";
  const query = (_get(currentPage, "options", {}) || {}) as QueryInfo<QK>;
  const queryStr = obj2Query(query);
  const fullPath = `${path}${queryStr}`;
  const params = {} as unknown as ParamsInfo<PK>;

  return {
    path,
    fullPath,
    query,
    params,
  };
};
